import { InjectionKey } from 'vue';

export interface TableOption {
  label: string;
  value: string;
}
/**
 * Conditions，执行条件
 */
export interface Conditions {
  conditions?: Condition[];
  conjs?: Conj[];
  splitIndexes?: number[];
}

/**
 * Condition
 */
export interface Condition {
  /**
   * 左边表达式
   */
  left: string;
  /**
   * 运算符
   */
  operator: Operator;
  /**
   * 右边表达式
   */
  right: string;
  /**
   * 右边表达式类型
   */
  rightType: RightType;
}

/**
 * 运算符
 */
export enum Operator {
  Eq = 'EQ',
  Ge = 'GE',
  Gt = 'GT',
  LE = 'LE',
  Lt = 'LT',
  Neq = 'NEQ'
}

/**
 * 右边表达式类型
 */
export enum RightType {
  Constant = 'CONSTANT',
  Variable = 'VARIABLE'
}

export enum Conj {
  And = 'AND',
  Or = 'OR'
}

/**
 * Parameter 参数
 */
export interface Parameter {
  /**
   * 初始值
   */
  initValue?: string;
  /**
   * 字段中文名
   */
  varLabel?: string;
  /**
   * 字段名称
   */
  varName?: string;
  /**
   * 字段类型 0: 字符, 1: 整数, 2:浮点数
   */
  varType?: VarType;
  id?: string;
}

/**
 * AggColumns 参数
 */
export interface AggColumns {
  /**
   * 聚合表别名
   */
  alias?: string;
  /**
   * 聚合列
   */
  column?: string;
  /**
   * 聚合函数 枚举值: SUM COUNT AVG MAX MIN
   */
  aggFunc?: 'SUM' | 'COUNT' | 'AVG' | 'MAX' | 'MIN';
  id?: string;
}

/**
 * 字段类型 0: 字符, 1: 整数, 2:浮点数
 */
export enum VarType {
  Boolean = 'BOOLEAN',
  DateTime = 'DATE_TIME',
  Decimal = 'DECIMAL',
  Integer = 'INTEGER',
  String = 'STRING',
  Date = 'DATE',
  Enum = 'ENUM'
}

export interface RuleForm {
  dataModelName: string;
  tableID: string;
  columns: string[];
  parameters: Parameter[];
  aggColumns: AggColumns[];
  conditions: Conditions;
}

// 表单输入限制
export const INPUT_MAX_DATA_MODEL_NAME = 50;
export const INPUT_MIN_DATA_MODEL_NAME = 1;

export const dataModelKey = Symbol() as InjectionKey<any>;
